home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / netlib / Net_StringToInetAddr.c < prev    next >
C/C++ Source or Header  |  1992-06-09  |  3KB  |  142 lines

  1. /* 
  2.  * Net_StringToInetAddr.c --
  3.  *
  4.  *    Convert a string to an internet address.
  5.  *
  6.  * Copyright 1987 Regents of the University of California
  7.  * All rights reserved.
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software and its documentation for any purpose and without
  10.  * fee is hereby granted, provided that the above copyright
  11.  * notice appear in all copies.  The University of California
  12.  * makes no representations about the suitability of this
  13.  * software for any purpose.  It is provided "as is" without
  14.  * express or implied warranty.
  15.  */
  16.  
  17. #ifndef lint
  18. static char rcsid[] = "$Header: /sprite/src/lib/c/netlib/RCS/Net_StringToInetAddr.c,v 1.1 88/11/21 09:10:29 mendel Exp $ SPRITE (Berkeley)";
  19. #endif not lint
  20.  
  21.  
  22. #include "sprite.h"
  23. #include "net.h"
  24.  
  25. /*
  26.  *----------------------------------------------------------------------
  27.  *
  28.  * Net_StringToInetAddr --
  29.  *
  30.  *    This routine takes a string form of an Internet address and
  31.  *    converts it to the Net_InetAddress form. The string must be
  32.  *    null-terminated.
  33.  *
  34.  *    "All the network library routines call this routine to interpret 
  35.  *    entries in the data bases which are expected to be an address.
  36.  *     The value returned is in network order."
  37.  *
  38.  * Results:
  39.  *    The Internet address in the Net_InetAddress form.
  40.  *
  41.  * Side effects:
  42.  *    None.
  43.  *
  44.  *----------------------------------------------------------------------
  45.  */
  46.  
  47. Net_InetAddress
  48. Net_StringToInetAddr(cp)
  49.     register char *cp;
  50. {
  51.     register unsigned int value;
  52.     register unsigned int base;
  53.     register char c;
  54.     unsigned int parts[4];
  55.     register unsigned int *partsPtr = parts;
  56.  
  57. again:
  58.     /*
  59.      * Collect number up to ``.''.
  60.      * Values are specified as for C: 0x=hex, 0=octal, other=decimal.
  61.      */
  62.  
  63.     value = 0; 
  64.     base = 10;
  65.     if (*cp == '0') {
  66.     base = 8;
  67.     cp++;
  68.     }
  69.     if (*cp == 'x' || *cp == 'X') {
  70.     base = 16;
  71.     cp++;
  72.     }
  73.  
  74.     c = *cp;
  75.     while (c != '\0') {
  76.     if (isdigit(c)) {
  77.         value = (value * base) + (c - '0');
  78.     } else if (base == 16 && isxdigit(c)) {
  79.         value = (value << 4) + (c + 10 - (islower(c) ? 'a' : 'A'));
  80.     } else {
  81.         break;
  82.     }
  83.     cp++;
  84.     c = *cp;
  85.     }
  86.  
  87.     if (*cp == '.') {
  88.     /*
  89.      * Internet format:
  90.      *    a.b.c.d
  91.      *    a.b.c    (with c treated as 16-bits)
  92.      *    a.b    (with b treated as 24 bits)
  93.      */
  94.     if (partsPtr >= parts + 4) {
  95.         return(NET_INET_BROADCAST_ADDR);
  96.     }
  97.     *partsPtr = value;
  98.     partsPtr++;
  99.     cp++;
  100.     goto again;
  101.     }
  102.  
  103.     /*
  104.      * Check for trailing characters.
  105.      */
  106.     if ((*cp != '\0') && (!isspace(*cp))) {
  107.     return(NET_INET_BROADCAST_ADDR);
  108.     }
  109.     *partsPtr = value;
  110.     partsPtr++;
  111.  
  112.     /*
  113.      * Concoct the address according to the number of parts specified.
  114.      */
  115.  
  116.     switch (partsPtr - parts) {
  117.  
  118.     case 1:                /* a -- 32 bits */
  119.         value = parts[0];
  120.         break;
  121.  
  122.     case 2:                /* a.b -- 8.24 bits */
  123.         value = (parts[0] << 24) | (parts[1] & 0xffffff);
  124.         break;
  125.  
  126.     case 3:                /* a.b.c -- 8.8.16 bits */
  127.         value = (parts[0] << 24) | ((parts[1] & 0xff) << 16) |
  128.             (parts[2] & 0xffff);
  129.         break;
  130.  
  131.     case 4:                /* a.b.c.d -- 8.8.8.8 bits */
  132.         value = (parts[0] << 24) | ((parts[1] & 0xff) << 16) |
  133.               ((parts[2] & 0xff) << 8) | (parts[3] & 0xff);
  134.         break;
  135.  
  136.     default:
  137.         return(NET_INET_BROADCAST_ADDR);
  138.     }
  139.     return(Net_HostToNetInt(value));
  140. }
  141.  
  142.